package com.scrcu.cloud.wechat.home.endpoint.common.model;

import com.alibaba.fastjson.JSONObject;
import lombok.Getter;
import lombok.Setter;

import java.io.Serializable;

/**
 * @auther: 刘思良
 * @date: 2023/9/21 15:20
 * @description: 公共返回结果
 * @version: 1.0.0
 */
@Getter
@Setter
public class RestResponse implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 响应状态：true/false
     */
    private boolean succeed = true;

    /**
     * 响应吗
     */
    private String errCode;

    /**
     * 响应信息
     */
    private String errMsg;

    /**
     * 返回数据
     */
    private Object data;

    /**
     * 成功响应
     *
     * @param data 数据
     * @param <T>  结果类型
     * @return 结果
     */
    public static <T> RestResponse success(T data) {
        return restResponse(true, null, null, data);
    }

    /**
     * 成功响应
     *
     * @param errCode 响应码
     * @param errMsg  响应信息
     * @param data    数据
     * @param <T>     结果类型
     * @return 结果
     */
    public static <T> RestResponse success(String errCode, String errMsg, T data) {
        return restResponse(true, errCode, errMsg, data);
    }

    /**
     * 成功响应
     *
     * @return 结果
     */
    public static RestResponse success() {
        return success(null);
    }

    /**
     * 成功响应--单json数据
     *
     * @param key   变量
     * @param Value 值
     * @param <T>   结果类型
     * @return 结果
     */
    public static <T> RestResponse success(String key, Object Value) {
        JSONObject jdata = new JSONObject();
        jdata.put(key, Value);
        return restResponse(true, null, null, jdata);
    }

    /**
     * 失败响应
     *
     * @return 结果
     */
    public static RestResponse failed() {
        return restResponse(false, "500", "交易失败", null);
    }

    /**
     * 失败响应
     *
     * @return 结果
     */
    public static RestResponse failed(String errorCode, String errMsg) {
        return restResponse(false, errorCode, errMsg, null);
    }

    /**
     * 失败响应
     *
     * @return 结果
     */
    public static RestResponse failed(String errMsg) {
        return restResponse(false, null, errMsg, null);
    }

    /**
     * 失败响应
     *
     * @return 结果
     */
    public static  <T> RestResponse failedWithData(String errCode, String errMsg, Object data) {
        return restResponse(false, errCode, errMsg, data);
    }

    private static <T> RestResponse restResponse(boolean succeed, String errCode, String errMsg, T data) {
        RestResponse result = new RestResponse();
        result.setSucceed(succeed);
        result.setErrCode(errCode);
        result.setErrMsg(errMsg);
        result.setData(data);
        return result;
    }

    /**
     * 参数校验失败返回
     *
     * @param errorMsg 错误信息
     * @return
     */
    public static RestResponse validateFailed(String[] errorMsg) {
        RestResponse result = new RestResponse();
        result.setSucceed(false);
        result.setErrCode("401");
        result.setErrMsg("请求参数校验失败");
        result.setData(errorMsg);
        return result;
    }

    @Override
    public String toString() {
        return "RestResponse{" +
                "succeed=" + succeed +
                ", errCode='" + errCode + '\'' +
                ", errMsg='" + errMsg + '\'' +
                ", data=" + data +
                '}';
    }
}
